001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-9-4
005 * Time: 13:50:04
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util.unifyutils;
010
011 import EVolve.visualization.*;
012 import EVolve.visualization.XYViz.XYVisualization;
013 import EVolve.Scene;
014 import EVolve.util.unifyutils.UnifiedVisualization;
015
016 import javax.swing.*;
017 import java.util.ArrayList;
018 import java.awt.*;
019 import java.awt.event.*;
020
021 public class UnifiedVisualizationRunner {
022 private ArrayList[] unifiedDimension;
023 private JDialog dialog;
024 private List availableList;
025 private List unifiableList;
026 private ArrayList unifiableViz;
027 private JComboBox comboDimension;
028 private int dimension;
029
030
031 public UnifiedVisualizationRunner() {
032 unifiedDimension = new ArrayList[3];
033 for (int i=0;i<unifiedDimension.length;i++) unifiedDimension[i] = new ArrayList();
034 unifiableViz = new ArrayList();
035 }
036
037 public void createDialog() {
038 dialog = new JDialog(Scene.getFrame(), "Unifying Visualizations...", true);
039 dialog.setBounds(new Rectangle(500,400));
040
041 Box boxMain = new Box(BoxLayout.Y_AXIS);
042 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
043 "Choose Visualizations to be unified"));
044 dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
045
046 Box boxLabels = new Box(BoxLayout.X_AXIS);
047 boxLabels.add(new JLabel("Available visualizations:"));
048 boxLabels.add(Box.createHorizontalStrut(195));
049 boxLabels.add(new JLabel("Unifiable visualizations:"));
050
051 Box boxLinkDimension = new Box(BoxLayout.Y_AXIS);
052 boxLinkDimension.setBounds(new Rectangle(20,300));
053 comboDimension = new JComboBox();
054 comboDimension.setEnabled(false);
055
056
057 boxLinkDimension.add(Box.createVerticalStrut(40));
058 boxLinkDimension.add(new JLabel("Choose unified dimension "));
059 boxLinkDimension.add(Box.createVerticalStrut(10));
060 boxLinkDimension.add(comboDimension);
061 comboDimension.setBounds(new Rectangle(20,20));
062 boxLinkDimension.add(Box.createVerticalStrut(205));
063 comboDimension.addActionListener(new ActionListener() {
064 public void actionPerformed(ActionEvent e) {
065 updateLinkableList();
066 }
067 });
068
069
070 Box boxLists = new Box(BoxLayout.X_AXIS);
071 availableList = new List(6,false);
072 ArrayList arr = Scene.getVisualizationManager().getVisualizationList();
073 for (int i=0; i<arr.size(); i++) {
074 availableList.add((((Visualization)arr.get(i)).getName()));
075 }
076 availableList.addItemListener(new ItemListener() {
077 public void itemStateChanged(ItemEvent e){
078 updateComboDimension();
079 }
080 });
081 unifiableList = new java.awt.List(6,true);
082 boxLists.add(availableList);
083 boxLists.add(Box.createHorizontalStrut(10));
084 boxLists.add(boxLinkDimension);
085 boxLists.add(Box.createHorizontalStrut(10));
086 boxLists.add(unifiableList);
087
088 boxMain.add(boxLabels);
089 boxMain.add(boxLists);
090
091 Box boxOkCancel = new Box(BoxLayout.X_AXIS);
092 JButton buttonOK = new JButton("OK");
093 JButton buttonCancel = new JButton("Cancel");
094
095 buttonOK.addActionListener(new ActionListener(){
096 public void actionPerformed(ActionEvent e){
097 onOK();
098 }
099 });
100 buttonCancel.addActionListener(new ActionListener(){
101 public void actionPerformed(ActionEvent e){
102 onCancel();
103 }
104 });
105 boxOkCancel.add(Box.createHorizontalStrut(180));
106 boxOkCancel.add(buttonOK);
107 boxOkCancel.add(Box.createHorizontalStrut(20));
108 boxOkCancel.add(buttonCancel);
109
110 dialog.getContentPane().add(boxOkCancel,BorderLayout.SOUTH);
111 }
112
113 private void updateComboDimension() {
114 int index = availableList.getSelectedIndex();
115
116 if (index == -1) return;
117 Visualization visual = (Visualization) Scene.getVisualizationManager().getVisualizationList().get(index);
118 int[] flags = getLinkableDimension(visual);
119
120 comboDimension.removeAllItems();
121 for (int i=0; i<flags.length; i++) {
122 switch (i) {
123 case 0:
124 if (flags[i] == 1)
125 comboDimension.addItem("X-Axis");
126 break;
127 case 1:
128 if (flags[i] == 1)
129 comboDimension.addItem("Y-Axis");
130 break;
131 case 2:
132 if (flags[i] == 1)
133 comboDimension.addItem("Z-Axis");
134 break;
135 }
136 }
137 if (comboDimension.getItemCount() != 0) {
138 comboDimension.setSelectedIndex(0);
139 comboDimension.setEnabled(true);
140 } else {
141 comboDimension.setEnabled(false);
142 unifiableList.removeAll();
143 }
144 }
145
146 private void updateLinkableList() {
147 int index = availableList.getSelectedIndex();
148 Visualization visual = (Visualization) Scene.getVisualizationManager().getVisualizationList().get(index);
149
150 String selectedItem = (String)comboDimension.getSelectedItem();
151 if (selectedItem.charAt(0) == 'X') {
152 dimension = 0;
153 } else if (selectedItem.charAt(0) == 'Y') {
154 dimension = 1;
155 } else {
156 dimension = 2;
157 }
158 unifiableList.removeAll();
159 getLinkableVisualization(visual,dimension);
160 for (int i=0; i<unifiableViz.size(); i++) {
161 unifiableList.add(((Visualization)unifiableViz.get(i)).getName());
162 }
163 }
164
165 private int[] getLinkableDimension(Visualization visual) {
166 int[] returnVal = new int[visual.getDimension().length];
167
168 for (int i=0; i<returnVal.length; i++) {
169 if (visual.getLinkableDimension(i) != null )
170 returnVal[i] = 1;
171 else
172 returnVal[i] = 0;
173 }
174 return returnVal;
175 }
176
177 private void getLinkableVisualization(Visualization visual,int dimension) {
178 ArrayList arr = Scene.getVisualizationManager().getVisualizationList();
179
180 unifiableViz.clear();
181 for (int i=0; i< arr.size(); i++) {
182 if (i == availableList.getSelectedIndex()) continue;
183 Visualization visual2 = (Visualization)arr.get(i);
184 if (isLinkable(visual,visual2,dimension)) unifiableViz.add(visual2);
185 }
186 }
187
188 public void onOK() {
189 int[] indexes = unifiableList.getSelectedIndexes();
190
191 if (indexes.length == 0) {
192 Scene.showErrorMessage("Please select visualizations to be linked");
193 return;
194 }
195
196 Visualization[] viz= new Visualization[indexes.length +1];
197
198 viz[0] = (Visualization)Scene.getVisualizationManager().getVisualizationList().get(availableList.getSelectedIndex());
199 for (int i=0; i<indexes.length; i++) {
200 viz[i+1] = (Visualization)unifiableViz.get(indexes[i]);
201 }
202 dialog.setVisible(false);
203 newLinkedVisualization(dimension,viz);
204 runLinkedVisualization();
205 }
206
207 public void onCancel() {
208 dialog.setVisible(false);
209 }
210
211 public void showWindow() {
212 createDialog();
213 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
214 }
215
216 public void newLinkedVisualization(int dim, Visualization[] viz) {
217 UnifiedVisualization linkedViz = null;
218 int linkingNo = -1;
219
220 for (int j =0; j< viz.length; j++) {
221 for (int i = 0; i < unifiedDimension[dim].size(); i++) {
222 linkedViz = (UnifiedVisualization) unifiedDimension[dim].get(i);
223 if (linkedViz.exists(viz[j])) {
224 linkingNo = i;
225 j = viz.length +1;
226 break;
227 }
228 }
229 }
230
231 if (linkingNo == -1) {
232 linkedViz = new UnifiedVisualization(dim);
233 unifiedDimension[dim].add(linkedViz);
234 }
235
236 linkedViz.addVisualization(viz);
237 }
238
239 public boolean isLinkable(Visualization visualLinked,Visualization visualLinking,int dim) {
240 int typeLinked, typeLinking;
241 ReferenceDimension linkableDim = visualLinked.getLinkableDimension(dim);
242
243 if ((visualLinked.getLinkableDimension(dim) == null)||
244 (visualLinking.getLinkableDimension(dim) == null)) return false;
245
246 typeLinked = linkableDim.getDataFilter().getTargetType();
247
248 if (visualLinking.getDimension().length<dim+1)
249 return false;
250 else
251 typeLinking = visualLinking.getLinkableDimension(dim).getDataFilter().getTargetType();
252
253 if ((visualLinking.getSubjectDefinition().getName().equals(visualLinked.getSubjectDefinition().getName())) &&
254 (visualLinking.getFactory().getName().equals(visualLinked.getFactory().getName())) &&
255 (visualLinking.getDimension()[0].getName().equals(visualLinked.getDimension()[0].getName())) &&
256 (visualLinking.getDimension()[1].getName().equals(visualLinked.getDimension()[1].getName())) &&
257 (visualLinking.getVisualizationID()==visualLinked.getVisualizationID()))
258 return false;
259
260 if ((!(visualLinking instanceof XYVisualization))||(!(visualLinked instanceof XYVisualization)))
261 return false;
262
263 return (typeLinked == typeLinking ? true : false);
264 }
265
266 public void runLinkedVisualization() {
267 for (int i=0; i<unifiedDimension.length; i++) {
268 for (int j=0; j<unifiedDimension[i].size(); j++) {
269 UnifiedVisualization linkedVisualization = (UnifiedVisualization)unifiedDimension[i].get(j);
270 linkedVisualization.visualize();
271 }
272 }
273 }
274
275 public void unregisterLinkedViz(Visualization viz) {
276 int delCount = 0;
277 for (int i=0; i<unifiedDimension.length; i++) {
278 for (int j=0; j<unifiedDimension[i].size(); j++) {
279 UnifiedVisualization linkedVisualization = (UnifiedVisualization)unifiedDimension[i].get(j-delCount);
280 int vizLeft = linkedVisualization.unregisterViz(viz);
281 if (vizLeft == 0) {
282 unifiedDimension[i].remove(j-delCount);
283 delCount++;
284 }
285
286 }
287 }
288 }
289 }